package com.ll.ticket;

/**
 * @author 刘龙
 * @version 1.0
 * 使用多线程, 模拟三个窗口同时售票100张
 */
public class SellTicket {
    public static void main(String[] args) {
        // 测试
/*        SellTicket01 sellTicket01 = new SellTicket01();
        SellTicket01 sellTicket02 = new SellTicket01();
        SellTicket01 sellTicket03 = new SellTicket01();

        sellTicket01.start();
        sellTicket02.start();
        sellTicket03.start();*/

        SellTicket02 sellTicket02 = new SellTicket02();
        // 第1个线程
        new Thread(sellTicket02).start();
        // 第1个线程
        new Thread(sellTicket02).start();
        // 第2个线程
        new Thread(sellTicket02).start();
    }
}

/**
 *  Thread方式,会出现超卖方式
 */
class SellTicket01 extends Thread {
    /**
     * 让多个线程共享num
     */
    private static Integer ticketNum = 100;
    @Override
    public void run() {
        while (true) {
            if (ticketNum <= 0) {
                System.out.println("票已售光");
                break;
            }

            //休眠50毫秒
            try {
                Thread.sleep(50);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

            System.out.println("窗口 " + Thread.currentThread().getName() +
                    " 售出一张票, 剩余票数 : " +  (--ticketNum));
        }

    }
}

/**
 * 实现Runnable接口方式,会出现超卖方式
 */
class SellTicket02 implements Runnable {
    /**
     * 让多个线程共享num
     */
    private Integer ticketNum = 100;

    @Override
    public void run() {
        while (true) {
            if (ticketNum <= 0) {
                System.out.println("票已售光");
                break;
            }

            //休眠50毫秒
            try {
                Thread.sleep(50);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

            System.out.println("窗口 " + Thread.currentThread().getName() +
                    " 售出一张票, 剩余票数 : " +  (--ticketNum));
        }
    }
}
